package com.wys.spring.db;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class DataSourceHandler {

    private static final Logger logger = LoggerFactory.getLogger(DataSourceHandler.class);

    private static final ThreadLocal<String> threadLocal = ThreadLocal.withInitial(String::new);


    /*fixme
     * 使用此方法前请优先需要确认在多数据源切换的场景中是否使用了事务,如果使用了请务必确认事务提交时
     * （在没有手动指明的情况下一般会使用主数据源即master）的数据源是否与此方法切换的数据源一致！！！
     * {@see 在方法内部切换数据源，‌可能会导致数据源切换失效，‌因为REQUIRED（spring默认的事务传播属性）传播属性会使得所有数据源操作都在同一个事务中执行}
     * @param dataSourceName 数据源名称
     */
    public static void putDataSource(String dataSourceName) {
        Assert.isTrue(StringUtils.isNotBlank(dataSourceName), "数据源名称不能为空");
        threadLocal.set(dataSourceName);
        logger.info(">>>>>>>>>>>>>>>当前数据源:{}", dataSourceName);
    }

    public static String getDataSource() {
        return threadLocal.get();
    }


    /**
     * 设置了数据源后一定要调用此方法进行移出
     */
    public static void removeDataSource() {
        threadLocal.remove();
    }


}
